#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCloseEvent>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>
#include <QDebug>
#include <QDateTime>
#include <QtGlobal>

// 前向声明ChartWindow和MultiChartWindow类，避免循环依赖
class ChartWindow;
class MultiChartWindow;
// 根据Qt版本选择正确的命名空间处理方式
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
    #include <QtCharts> // Qt 6中使用通用头文件
#else
    #include <QtCharts/QChart>
    #include <QtCharts/QChartView>
    #include <QtCharts/QLineSeries>
    #include <QtCharts/QValueAxis>
    #ifndef QT_CHARTS_USE_NAMESPACE
        #define QT_CHARTS_USE_NAMESPACE
    #endif
    #include <QtCharts/QDateTimeAxis>
    QT_CHARTS_USE_NAMESPACE // Qt 5中使用这个宏启用命名空间
#endif

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_openButton_clicked();
    void on_refreshButton_clicked();
    void on_sendButton_clicked();
    void on_clearButton_clicked();
    void on_saveDataButton_clicked();
    void readData();
    void updateStatus();
    void closeEvent(QCloseEvent *event) override;
    void on_actionShowChart_triggered();
    void showDataWindow(int windowIndex);
    void sendPeriodicData();
    void on_periodicSendCheckBox_stateChanged(int arg1);
    void handleSerialOpenResult(bool success, const QString &errorMsg);
    void safeCloseSerial(); // 安全关闭串口的方法
    
    // 重置数据计数器的槽函数
    void resetDataCounter();
    
    // 更新时间轴的槽函数，即使没有新数据也能让时间轴继续滚动
    void updateTimeAxis();
    
    // 暂停/继续曲线显示的槽函数
    void on_pauseButton_clicked();

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
    QTimer *statusTimer;
    bool isPaused; // 表示当前是否处于暂停状态
    QTimer *periodicSendTimer;
    QCheckBox *periodicSendCheckBox;
    QLineEdit *periodicSendSpinBox;
    
    // 串口连接状态和控制
    QMetaObject::Connection readyReadConnection; // 保存readyRead信号连接
    bool isClosing; // 标记是否正在关闭串口
    
    // 状态栏时钟
    QLabel *clockLabel;
    
    qint64 dataCounter;
    qint64 maxPoints; // 图表显示的采样点数量(X轴范围)
    qint64 dataLimit; // 数据采集的上限
    ChartWindow *chartWindow;
    
    // 用于处理无数据时时间轴继续滚动的成员变量
    QTimer *timeAxisTimer; // 用于更新时间轴的定时器
    int lastDataUpdateTime; // 上次收到数据的时间戳(毫秒)
    int timeAxisUpdateInterval; // 时间轴更新间隔(毫秒)
    bool timeAxisAutoScroll; // 标记时间轴是否自动滚动
    
    // 六个独立的图表窗口指针
    ChartWindow *dataWindow1;
    ChartWindow *dataWindow2;
    ChartWindow *dataWindow3;
    ChartWindow *dataWindow4;
    ChartWindow *dataWindow5;
    ChartWindow *dataWindow6;
    
    // 多图表整合窗口
    MultiChartWindow *multiChartWindow;
    
    // 通道标题
    const QStringList channelTitles = {
        "加速度 (m/s²)", "加速度 (m/s²)", "加速度 (m/s²)",
        "声强", "温度 (°C)", "电压 (V)"
    };
    
    // 窗口标题列表
    const QStringList windowTitles = {
        "数据通道 1", "数据通道 2", "数据通道 3",
        "数据通道 4", "数据通道 5", "数据通道 6"
    };
    
    // 采样参数调节控件
    QLineEdit *sampleSizeEdit;  // 采样点数量手动输入
    QLineEdit *sampleTimeEdit;  // 采样时间范围手动输入
    QLabel *sampleSizeLabel;    // 显示当前采样点数量
    QLabel *sampleTimeLabel;    // 显示当前采样时间
    QLabel *sampleSizeRangeLabel;  // 采样点数量范围提示
    QLabel *sampleTimeRangeLabel;  // 采样时间范围提示
    
    // 数据采样相关变量
    QComboBox *dataSamplingComboBox; // 数据采样方式选择
    QSpinBox *samplingRateSpinBox; // 采样率设置
    QCheckBox *adaptiveSamplingCheckBox; // 自适应采样开关
    QDateTime startTime; // 开始接收数据的时间
    
    // 数据保存相关变量
    QPushButton *saveDataButton; // 保存数据按钮
    bool isSavingData; // 是否正在保存数据
    QFile *dataFile; // 数据文件
    QTextStream *dataStream; // 数据流
    
    void initUI();
    void initSerial();
    void loadPortSettings();
    void savePortSettings();
};

#endif // MAINWINDOW_H